package ota;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.ArraySet;

public class CheckSendDataUtils {
//	private byte[] otaByteData;
//	private LinkedList<Byte> otaListNeedSend;
//	private int MTU_VALUS;
//	private byte[] beforeThreeByte;// 报文首三个字节
//	// private int currentNo;//表示当前 子包的编号
//
//	private volatile static CheckSendDataUtils mCheckSendDataUtils;
//
//	private CheckSendDataUtils() {
//	}
//
//	public static CheckSendDataUtils getCheckSendDataUtilsInstance() {
//		if (mCheckSendDataUtils == null) {
//			synchronized (CheckSendDataUtils.class) {
//				if (mCheckSendDataUtils == null) {
//					mCheckSendDataUtils = new CheckSendDataUtils();
//				}
//			}
//		}
//		return mCheckSendDataUtils;
//	}
//
//	/**
//	 * 初始化数据
//	 */
//	public void initCheckSendDataUtils(byte[] otaDataByte, int mtuValus) {
//		this.MTU_VALUS = mtuValus;
//		otaByteData = otaDataByte;
//		otaListNeedSend = new LinkedList<Byte>();// 全部数据
//		for (int i = 0; i < otaByteData.length; i++) {
//			otaListNeedSend.add(otaByteData[i]);
//		}
//	}
//
//	/**
//	 * 该方法是用于发送下载下来的ota文件用的
//	 *
//	 * 对数据进行解析 boolean isOnlyNeedOneSend 是否只需要一包就可以发送 byte[] beforeThreeByte
//	 * 报文首三个字节
//	 *
//	 */
//	LinkedList<Byte> listByteNeedSend = new LinkedList<Byte>();// 需要发送的字节
//
//
//	private byte[] checkData(boolean isOnlyNeedOneSend) {
//		listByteNeedSend.removeAll(listByteNeedSend);
//		Date date = new Date();
//		SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss:SSS");
//		System.out.println("当前时间1"+dateFormat.format(date));
//
//		if (isOnlyNeedOneSend) {// 只需要一包
//
//			for (int i = 0; i < beforeThreeByte.length; i++) {
//				listByteNeedSend.add(beforeThreeByte[i]);
//			}
//
//			while (true) {
//				listByteNeedSend.add(otaListNeedSend.get(0));
//				otaListNeedSend.remove(0);
//				if (otaListNeedSend == null || otaListNeedSend.size() <= 0) {
//					break;
//				}
//			}
//
//			byte[] needSendByte = new byte[listByteNeedSend.size()];
//
//			for (int i = 0; i < listByteNeedSend.size(); i++) {
//				needSendByte[i] = listByteNeedSend.get(i);
//			}
//
//			return needSendByte;
//		} else {// 需要多包
//
//
//			for (int i = 0; i < beforeThreeByte.length; i++) {
//				listByteNeedSend.add(beforeThreeByte[i]);
//			}
//			Date date2 = new Date();
//			SimpleDateFormat dateFormat2= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss:SSS");
//			System.out.println("当前时间2"+dateFormat2.format(date2));
//
//			int currentDataIndex = 0;
//			while (true) {
//				byte currentByte=otaListNeedSend.get(0);
//				listByteNeedSend.add(currentByte);
//				otaListNeedSend.remove(0);
//				currentDataIndex++;
//
//				if (currentDataIndex >= MTU_VALUS - 3 - 3) {
//					break;
//				}
//
//			}
//
//			Date date3 = new Date();
//			SimpleDateFormat dateFormat3= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss:SSS");
//			System.out.println("当前时间3"+dateFormat3.format(date3));
//
//			byte[] needSendByte = new byte[listByteNeedSend.size()];
//
//			for (int i = 0; i < listByteNeedSend.size(); i++) {
//				needSendByte[i] = listByteNeedSend.get(i);
//			}
//
//			Date date4 = new Date();
//			SimpleDateFormat dateFormat4= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss:SSS");
//			System.out.println("当前时间4"+dateFormat4.format(date4));
//			return needSendByte;
//
//		}
//	}
//
//
//
//
//	/**
//	 * 判断当前数据是否满足mtu值
//	 */
//	public byte[] checkDataIsSatisfyMtuValus(byte[] beforeThreeByte) {
//		this.beforeThreeByte = beforeThreeByte;
//        if(otaListNeedSend==null||otaListNeedSend.size()<=0){
//        	return null;
//        }
//		int otaListNeedSendSize = otaListNeedSend.size();
//		if (otaListNeedSendSize <= MTU_VALUS - 3-3) {// 表示一包就可以发送
//			return checkData(true);
//		} else if (otaListNeedSendSize > MTU_VALUS - 3-3) {// 必须分包才可以发送
//			return checkData(false);
//		}
//		return null;
//
//	}
//
//	/**
//	 * 该方法是用于发送第一包数据时候使用
//	 *
//	 * 发送第一包数据 flagStyleInt 拆分包类型 flagCountsInt 数据包总共包数 flagVersionNoOld
//	 * 差分升级包原软件版本号 flagVersionNoNew 差分升级包新软件版本号
//	 *
//	 */
//	public byte[] firstFlagData(int flagStyleInt, int flagCountsInt, int flagVersionNoOldInt, int flagVersionNoNewInt) {
//		byte[] flagStyle = new byte[] { (byte) (flagStyleInt) };// 拆分包类型---1个字节
//		byte[] flagNo = intToByteArray(1);// 数据包编号---2个字节
//		byte[] flagCounts = intToByteArray(flagCountsInt);// 数据包总共包数---2个字节
//		byte[] flagVersionNoOld = intToByteArray(flagVersionNoOldInt);// 差分升级包原软件版本号---2个字节
//		byte[] flagVersionNoNew = intToByteArray(flagVersionNoNewInt);// 差分升级包新软件版本号---2个字节
//
//		byte[] needSendByte = new byte[9];
//		needSendByte[0] = flagStyle[0];
//
//		needSendByte[1] = flagNo[2];
//		needSendByte[2] = flagNo[3];
//
//		needSendByte[3] = flagCounts[2];
//		needSendByte[4] = flagCounts[3];
//
//		needSendByte[5] = flagVersionNoOld[2];
//		needSendByte[6] = flagVersionNoOld[3];
//
//		needSendByte[7] = flagVersionNoNew[2];
//		needSendByte[8] = flagVersionNoNew[3];
//
//		return needSendByte;
//
//	}
//
//	/**
//	 * 读取文件内容
//	 *
//	 * @param path
//	 * @return
//	 */
//	public byte[] readFileToByteArray(String path) {
//		File file = new File(path);
//		if (!file.exists()) {
//			return null;
//		}
//
//
//		FileInputStream in = null;
//		try {
//			in = new FileInputStream(file);
//			long inSize = in.getChannel().size();// 判断FileInputStream中是否有内容
//			if (inSize == 0) {
//				return null;
//			}
//
//			byte[] buffer = new byte[in.available()];// in.available()
//														// 表示要读取的文件中的数据长度
//			in.read(buffer); // 将文件中的数据读到buffer中
//			return buffer;
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//			return null;
//		} catch (IOException e) {
//			e.printStackTrace();
//			return null;
//		} finally {
//			try {
//				in.close();
//			} catch (IOException e) {
//				return null;
//			}
//			// 或IoUtils.closeQuietly(in);
//		}
//	}
//	/**
//	 * 将内容存放到闪存中去 sd卡
//	 * @param path
//	 * @param buffer
//	 */
//
//	public void writeAndFlush(String path, byte[] buffer) {
//		try {
//			FileOutputStream out = new FileOutputStream(path);// 指定写到哪个路径中
//			FileChannel fileChannel = out.getChannel();
//			fileChannel.write(ByteBuffer.wrap(buffer)); // 将字节流写入文件中
//			fileChannel.force(true);// 强制刷新
//			fileChannel.close();
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//	}
//
//	/**
//	 * 2 zip解压 3
//	 *
//	 * @param srcFile
//	 *            zip源文件 4
//	 * @param destDirPath
//	 *            解压后的目标文件夹 5
//	 * @throws RuntimeException
//	 *             解压失败会抛出运行时异常 6
//	 */
//
//	public static String unZip(File srcFile, String destDirPath) throws RuntimeException {
//		String fileName = "";
//		long start = System.currentTimeMillis();
//		// 判断源文件是否存在
//		if (!srcFile.exists()) {
//			throw new RuntimeException(srcFile.getPath() + "所指文件不存在");
//		}
//		// 开始解压
//		ZipFile zipFile = null;
//		try {
//			zipFile = new ZipFile(srcFile);
//			Enumeration<?> entries = zipFile.entries();
//			while (entries.hasMoreElements()) {
//				ZipEntry entry = (ZipEntry) entries.nextElement();
//				System.out.println("解压" + entry.getName());
//				// 如果是文件夹，就创建个文件夹
//				if (entry.isDirectory()) {
//					String dirPath = destDirPath + "/" + entry.getName();
//					File dir = new File(dirPath);
//					fileName = entry.getName();
//					dir.mkdirs();
//				} else {
//					// 如果是文件，就先创建一个文件，然后用io流把内容copy过去
//					File targetFile = new File(destDirPath + "/" + entry.getName());
//					// 保证这个文件的父文件夹必须要存在
//					if (!targetFile.getParentFile().exists()) {
//						targetFile.getParentFile().mkdirs();
//					}
//					targetFile.createNewFile();
//					// 将压缩文件内容写入到这个文件中
//					InputStream is = zipFile.getInputStream(entry);
//					FileOutputStream fos = new FileOutputStream(targetFile);
//					int len;
//					byte[] buf = new byte[1024];
//					while ((len = is.read(buf)) != -1) {
//						fos.write(buf, 0, len);
//					}
//					// 关流顺序，先打开的后关闭
//					fos.close();
//					is.close();
//				}
//			}
//			long end = System.currentTimeMillis();
//			System.out.println("解压完成，耗时：" + (end - start) + " ms");
//		} catch (Exception e) {
//			throw new RuntimeException("unzip error from ZipUtils", e);
//		} finally {
//			if (zipFile != null) {
//				try {
//					zipFile.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		return fileName;
//	}
//
//	public static ArrayList<String> traverseFolder(String path) {
//		ArrayList<String> fileNameList = new ArrayList<String>();
//
//		File file = new File(path);
//		if (!file.exists()) {
//			file.mkdirs();
//
//			File[] files = file.listFiles();
//			if (null == files || files.length == 0) {
//				System.out.println("文件夹是空的!");
//				return null;
//			} else {
//				for (File file2 : files) {
//					if (file2.isDirectory()) {
//						System.out.println("文件夹:" + file2.getAbsolutePath());
//						traverseFolder(file2.getAbsolutePath());
//						fileNameList = null;
//					} else {
//						fileNameList.add(file2.getAbsolutePath());
//						System.out.println("文件:" + file2.getAbsolutePath());
//					}
//				}
//			}
//		}else{
//			File[] files = file.listFiles();
//			if (null == files || files.length == 0) {
//				System.out.println("文件夹是空的!");
//				return null;
//			} else {
//				for (File file2 : files) {
//					if (file2.isDirectory()) {
//						System.out.println("文件夹:" + file2.getAbsolutePath());
//						traverseFolder(file2.getAbsolutePath());
//						fileNameList = null;
//					} else {
//						fileNameList.add(file2.getAbsolutePath());
//						System.out.println("文件:" + file2.getAbsolutePath());
//					}
//				}
//			}
//		}
////		if (file.exists()) {
////
////		} else {
////			System.out.println("文件不存在!");
////			fileNameList = null;
////		}
//		return fileNameList;
//	}
//
//	public static byte[] intToByteArray(int i) {
//		byte[] result = new byte[4];
//		result[0] = (byte) ((i >> 24) & 0xFF);
//		result[1] = (byte) ((i >> 16) & 0xFF);
//		result[2] = (byte) ((i >> 8) & 0xFF);
//		result[3] = (byte) (i & 0xFF);
//		return result;
//	}
//
//	/**
//	 * 获取文件路径
//	 * @param context
//	 * @param uri
//	 * @return
//	 */
//	public  String getRealFilePath(final Context context, final Uri uri ) {
//		if ( null == uri ) return null;
//		final String scheme = uri.getScheme();
//		String data = null;
//		if ( scheme == null )
//			data = uri.getPath();
//		else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
//			data = uri.getPath();
//		} else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
//			Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
//			if ( null != cursor ) {
//				if ( cursor.moveToFirst() ) {
//					int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
//					if ( index > -1 ) {
//						data = cursor.getString( index );
//					}
//				}
//				cursor.close();
//			}
//		}
//		return data;
//	}

}
